home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr26 / netprog.zip / NETPROG.TAR / ping / sendping.c < prev    next >
C/C++ Source or Header  |  1989-12-17  |  2KB  |  71 lines

  1. /*
  2.  * Compose and transmit an ICMP ECHO REQUEST packet.  The IP header
  3.  * will be prepended by the kernel.  The ID field is our UNIX process ID,
  4.  * and the sequence number is an ascending integer.  The first 8 bytes
  5.  * of the data portion are used to hold a BSD UNIX "timeval" struct in host
  6.  * byte-order, to compute the round-trip time of each packet.
  7.  */
  8.  
  9. #include    "defs.h"
  10.  
  11. send_ping()
  12. {
  13.     register int        i;
  14.     register struct icmp    *icp;        /* ICMP header */
  15.     register u_char        *uptr;        /* start of user data */
  16.  
  17.     /*
  18.      * Fill in the ICMP header.
  19.      */
  20.  
  21.     icp = (struct icmp *) sendpack;    /* pointer to ICMP header */
  22.     icp->icmp_type  = ICMP_ECHO;
  23.     icp->icmp_code  = 0;
  24.     icp->icmp_cksum = 0;         /* init to 0, then call in_cksum() below */
  25.     icp->icmp_id    = ident;     /* our pid, to identify on return */
  26.     icp->icmp_seq   = ntransmitted++;    /* sequence number */
  27.  
  28.     /*
  29.      * Add the time stamp of when we sent it.
  30.      * gettimeofday(2) is a BSD system call that returns the current
  31.      * local time through its first argument.  The second argument is
  32.      * for time zone information, which we're not interested in.
  33.      */
  34.  
  35.     if (timing)
  36.         gettimeofday((struct timeval *) &sendpack[SIZE_ICMP_HDR],
  37.                  (struct timezone *) 0);
  38.  
  39.     /*
  40.      * And fill in the remainder of the packet with the user data.
  41.      * We just set each byte of udata[i] to i (although this is
  42.      * not verified when the echoed packet is received back).
  43.      */
  44.  
  45.     uptr = &sendpack[SIZE_ICMP_HDR + SIZE_TIME_DATA];
  46.     for (i = SIZE_TIME_DATA; i < datalen; i++)
  47.         *uptr++ = i;
  48.  
  49.     /*
  50.      * Compute and store the ICMP checksum (now that we've filled
  51.      * in the entire ICMP packet).  The checksum includes the ICMP
  52.      * header, the time stamp, and our user data.
  53.      */
  54.  
  55.     icp->icmp_cksum = in_cksum(icp, packsize);
  56.  
  57.     /*
  58.      * Now send the datagram.
  59.      */
  60.  
  61.     i = sendto(sockfd, sendpack, packsize, 0,
  62.             (struct sockaddr *) &dest, sizeof(dest));
  63.     if (i < 0 || i != packsize)  {
  64.         if (i < 0)
  65.             err_ret("sendto error");
  66.         else
  67.             err_ret("wrote %s %d bytes, return=%d",
  68.                         hostname, packsize, i);
  69.     }
  70. }
  71.